# dic1 = {'name':'zhangsan','age':23,'address':'BeiJing','name':'lisi'}
# 查看字典值发现重复的键值后面的替换前面的
# print(dic1)

# dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258',('a','b'):(12,43)}
# print(dict)

# 修改字典元素

# dict = {'Name': 'Fiona', 'Age': 10, 'Class': 'Three'}
# # 更新
# dict['Age'] = 8
# # 添加
# dict['School'] = "Middle School"
# print(dict)

# 删除字典元素
# dict = {'Name': 'Fiona', 'Age': 10, 'Class': 'Three'}

# 删除键是'Name'的条目
# del dict['Name']

# 清空字典所有条目
# dict.clear()

# 删除整个字典元素
# del dict
# print(dict)
# print("dict['Age']: ", dict['Age'])
# print("dict['School']: ", dict['School'])

# 字典键的特性
'''
1.不允许同一个键出现两次。创建时如果同一个键被赋值两次，后一个值会被记住（覆盖）
2.键必须不可变，所以可以用数字，字符串或元组充当，所以用列表就不行
'''
dict = {'Name': 'Fiona', 'Age': 10, 'Name': 'Manni'}
# dict = {['Name']: 'Fiona', 'Age': 10}  # TypeError: unhashable type: 'list'

# print(dict['Name'])

# 字典的函数
# len() 方法计算字典元素个数（键的总个数） len(dict)
# str() 方法输出字典中可以打印的字符串标识
# print(str(dict))
# type() 方法返回输入的变量类型，如果变量是字典就返回字典类型

# 字典的方法
# 删除字典内所有元素，clear() 方法没有任何返回值
# copy() 方法对字典进行复制
# dict11 = dict.copy()
# print(dict11)

dict1 = {'user': 'runoob', 'num': [1, 2, 3]}

'''
深拷贝 原始对象的改变不会造成深拷贝里任何子元素的改变 copy.deepcopy()
'''
# 浅拷贝: 引用对象  赋值  原始数据改变，子对象会改变
# dict2 = dict1
# # 拷贝
# import copy
# dict3 = copy.deepcopy(dict1)
# # print(dict2)
#
# # 修改 data 数据
# dict1['user'] = 'root'
# dict1['num'].remove(1)
#
# print(dict1)
# print(dict2)
# print(dict3)

# dict.fromkeys()
# 创建一个新字典，以序列seq中元素做字典的键，val为字典所有键对应的初始值，该方法返回一个新的字典
# seq = ('name', 'age', 'class')
# dict = dict.fromkeys(seq)
# print("新的字典为 : %s" % str(dict))
# get ()方法的应用举例 dict.get(key, default=None) 键不在字典中 返回default
# dict = {'Name': 'Mary', 'Age': 20}
#
# print ("Age 值为 : %s" %  dict.get('Age'))
# print ("Name 值为 : %s" %  dict.get('Name'))
# print ("Sex 值为 : %s" %  dict.get('Sex', "NA"))

# dict = {'Name': 'Mary', 'Age': 20,'Address':'BeiJing'}
# 检测键 Age 是否存在
# if 'Age' in dict:
#     print("键 Age 存在")
# else:
#     print("键 Age 不存在")

# 检测键 Sex 是否存在
# if 'Sex' in dict:
#     print("键 Sex 存在")
# else:
#     print("键 Sex 不存在")

# not in

# 检测键 Name 是否存在
# if 'Name' not in dict:
#     print("键 Name 不存在")
# else:
#     print("键 Name 存在")

# item() 方法以列表返回可遍历的(键, 值) 元组数组
# dict = {'Name': 'Mary', 'Age': 17}
# print("Value : %s" % dict.items())

# dict1 = {'老大':'25岁',
# #         '老二':'20岁',
# #         '老三':'12岁',
# #         }
# # print(dict1.items())
# # for key,values in dict1.items():
# #     print(key + '已经' + values + '了')

# dict.keys() 列表形式 输出所有键

#  dict.setdefault(key, default=None)   和get() 方法类似
# dict.update(dict2)  Python 字典 update() 函数把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里。（添加到后面）
# dict.values() 可以使用 list() 来转换为列表，列表为字典中的所有值。
# dict.pop(key[,default]) 字典 pop() 方法删除字典给定键 key 所对应的值，返回值为被删除的值。key 值必须给出。 否则，返回 default 值。
# dict = {'Name': 'Mary', 'Age': 17}
# result = dict.pop('Age') # 删除
# print(result)

# dict.popitem()
'''
Python 字典 popitem() 方法随机返回一个键值对(key,value)形式，
按照 LIFO（Last In First Out 后进先出法） 顺序规则，即最末尾的键值对。
 如果字典已经为空，却调用了此方法，就报出KeyError异常。
'''
# dict = {'Name': 'Mary', 'Age': 17}
# pop_obj=dict.popitem()
# print(pop_obj)
# print(dict)

'''
总结：
当列表元素内容一致，顺序不同再对比内容时匹配不成功，
同理字典值匹配成功，说明字典中元素内容不按顺序存放。
'''